package org.xx.armory.service.data;

import java.util.Objects;

import static org.apache.commons.lang3.StringUtils.trimToEmpty;
import static org.xx.armory.commons.Validators.notBlank;

/**
 * 字典项。
 *
 * @author Haart
 */
public final class DictItem {
    private final String key;
    private final String value;
    private final String parentKey;

    /**
     * 构造字典项。
     *
     * @param key
     *         键。
     * @param value
     *         值 , 将被正规化。
     * @param parentKey
     *         上级键, 将被正规化。
     * @throws IllegalArgumentException
     *         如果参数{@code key}是{@code null}或者只包含空白字符。
     */
    public DictItem(
            String key,
            String value,
            String parentKey
    ) {
        this.key = notBlank(key, "key").trim().toLowerCase();
        this.value = trimToEmpty(value);
        this.parentKey = trimToEmpty(parentKey).toLowerCase();
    }

    /**
     * 获取字典项的键。
     *
     * @return 字典项的键。
     */
    public final String getKey() {
        return this.key;
    }

    /**
     * 获取字典项的值。
     *
     * @return 字典项的值。
     */
    public final String getValue() {
        return this.value;
    }

    /**
     * 获取字典项的上级键。
     *
     * @return 字典项的上级键。
     */
    public final String getParentKey() {
        return this.parentKey;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return Objects.hash(this.key, this.value);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        DictItem other = (DictItem) obj;
        return Objects.equals(this.key, other.key) && Objects.equals(this.value, other.value);
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        final String key = !this.parentKey.isEmpty() ? this.parentKey + "." + this.key : this.key;
        return key + "=" + this.value;
    }
}
